package org.convallaria.framework.common.constants.sys;

/**
 * 岗位相关常量
 * 
 * 功能特性：
 * - 定义岗位状态常量
 * - 定义岗位字段长度限制
 * - 提供统一的常量管理
 * 
 * 设计原则：
 * - 所有常量都是public static final
 * - 使用final类防止继承
 * - 私有构造函数防止实例化
 * - 按功能模块分组组织
 * 
 * @author convallaria
 * @since 1.0.0
 */
public final class PostConstants {

    private PostConstants() {
        // 防止实例化
    }

    // ==================== 岗位状态常量 ====================

    /**
     * 岗位正常状态
     */
    public static final String POST_STATUS_NORMAL = "0";

    /**
     * 岗位停用状态
     */
    public static final String POST_STATUS_DISABLED = "1";

    // ==================== 岗位字段长度限制 ====================

    /**
     * 岗位编码最大长度
     */
    public static final int POST_CODE_MAX_LENGTH = 64;

    /**
     * 岗位名称最大长度
     */
    public static final int POST_NAME_MAX_LENGTH = 50;

    /**
     * 备注最大长度
     */
    public static final int REMARK_MAX_LENGTH = 500;

    /**
     * 显示顺序最小值
     */
    public static final int POST_SORT_MIN = 0;

    /**
     * 显示顺序最大值
     */
    public static final int POST_SORT_MAX = 999;

    // ==================== 岗位状态描述 ====================

    /**
     * 岗位状态描述映射
     */
    public static final String[] POST_STATUS_DESCRIPTIONS = {
        "正常", "停用"
    };

    // ==================== 默认值常量 ====================

    /**
     * 默认岗位状态
     */
    public static final String DEFAULT_POST_STATUS = POST_STATUS_NORMAL;

    /**
     * 默认显示顺序
     */
    public static final int DEFAULT_POST_SORT = 0;

    // ==================== 业务规则常量 ====================

    /**
     * 岗位编码正则表达式（字母、数字、下划线、连字符）
     */
    public static final String POST_CODE_PATTERN = "^[a-zA-Z0-9_-]+$";

    /**
     * 岗位名称正则表达式（中文、字母、数字、下划线、连字符、空格）
     */
    public static final String POST_NAME_PATTERN = "^[\\u4e00-\\u9fa5a-zA-Z0-9_\\-\\s]+$";

    // ==================== 工具方法 ====================

    /**
     * 获取岗位状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getPostStatusDesc(String status) {
        if (POST_STATUS_NORMAL.equals(status)) {
            return POST_STATUS_DESCRIPTIONS[0];
        } else if (POST_STATUS_DISABLED.equals(status)) {
            return POST_STATUS_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 验证岗位状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidPostStatus(String status) {
        return POST_STATUS_NORMAL.equals(status) || POST_STATUS_DISABLED.equals(status);
    }

    /**
     * 验证岗位编码是否有效
     * 
     * @param postCode 岗位编码
     * @return true=有效，false=无效
     */
    public static boolean isValidPostCode(String postCode) {
        if (postCode == null || postCode.trim().isEmpty()) {
            return false;
        }
        if (postCode.length() > POST_CODE_MAX_LENGTH) {
            return false;
        }
        return postCode.matches(POST_CODE_PATTERN);
    }

    /**
     * 验证岗位名称是否有效
     * 
     * @param postName 岗位名称
     * @return true=有效，false=无效
     */
    public static boolean isValidPostName(String postName) {
        if (postName == null || postName.trim().isEmpty()) {
            return false;
        }
        if (postName.length() > POST_NAME_MAX_LENGTH) {
            return false;
        }
        return postName.matches(POST_NAME_PATTERN);
    }

    /**
     * 验证显示顺序是否有效
     * 
     * @param postSort 显示顺序
     * @return true=有效，false=无效
     */
    public static boolean isValidPostSort(Integer postSort) {
        if (postSort == null) {
            return false;
        }
        return postSort >= POST_SORT_MIN && postSort <= POST_SORT_MAX;
    }

    /**
     * 验证岗位信息是否完整
     * 
     * @param postCode 岗位编码
     * @param postName 岗位名称
     * @param status 状态
     * @return true=完整，false=不完整
     */
    public static boolean isValidPostInfo(String postCode, String postName, String status) {
        return isValidPostCode(postCode) 
            && isValidPostName(postName) 
            && isValidPostStatus(status);
    }

    /**
     * 格式化岗位显示名称
     * 
     * @param postCode 岗位编码
     * @param postName 岗位名称
     * @return 格式化后的显示名称
     */
    public static String formatPostDisplayName(String postCode, String postName) {
        if (postCode == null || postCode.trim().isEmpty()) {
            return postName != null ? postName : "未知岗位";
        }
        if (postName == null || postName.trim().isEmpty()) {
            return postCode;
        }
        return postName + "(" + postCode + ")";
    }

    /**
     * 判断岗位编码是否重复（忽略大小写）
     * 
     * @param postCode1 岗位编码1
     * @param postCode2 岗位编码2
     * @return true=重复，false=不重复
     */
    public static boolean isPostCodeDuplicate(String postCode1, String postCode2) {
        if (postCode1 == null || postCode2 == null) {
            return false;
        }
        return postCode1.equalsIgnoreCase(postCode2);
    }

    /**
     * 判断岗位名称是否重复（忽略大小写和空格）
     * 
     * @param postName1 岗位名称1
     * @param postName2 岗位名称2
     * @return true=重复，false=不重复
     */
    public static boolean isPostNameDuplicate(String postName1, String postName2) {
        if (postName1 == null || postName2 == null) {
            return false;
        }
        return postName1.trim().equalsIgnoreCase(postName2.trim());
    }

    /**
     * 清理岗位编码（去除特殊字符，转换为大写）
     * 
     * @param postCode 原始岗位编码
     * @return 清理后的岗位编码
     */
    public static String cleanPostCode(String postCode) {
        if (postCode == null || postCode.trim().isEmpty()) {
            return "";
        }
        return postCode.replaceAll("[^a-zA-Z0-9_-]", "").toUpperCase();
    }

    /**
     * 清理岗位名称（去除多余空格）
     * 
     * @param postName 原始岗位名称
     * @return 清理后的岗位名称
     */
    public static String cleanPostName(String postName) {
        if (postName == null) {
            return "";
        }
        return postName.trim().replaceAll("\\s+", " ");
    }
}
